home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / ewl / ewl_object.h < prev    next >
C/C++ Source or Header  |  2006-01-09  |  13KB  |  342 lines

  1. #ifndef __EWL_OBJECT_H__
  2. #define __EWL_OBJECT_H__
  3.  
  4. /**
  5.  * @file ewl_object.h
  6.  * @defgroup Ewl_Object Object: Basic Object Inherited by Ewl_Widget
  7.  * @brief Defines the Ewl_Object class along with methods and macros related
  8.  * to it.
  9.  *
  10.  * @{
  11.  */
  12.  
  13. /**
  14.  * @def EWL_OBJECT_MIN_SIZE The minimum possible size any object can receive.
  15.  */
  16. #define EWL_OBJECT_MIN_SIZE (1)
  17. /**
  18.  * @def EWL_OBJECT_MIN_SIZE The maximum possible size any object can receive.
  19.  */
  20. #define EWL_OBJECT_MAX_SIZE (INT_MAX)
  21.  
  22. /**
  23.  * The base class inherited by all widgets. Provides methods for size and
  24.  * position.
  25.  */
  26. typedef struct Ewl_Object Ewl_Object;
  27.  
  28. /**
  29.  * @def EWL_OBJECT(object) A typecast for accessing the inherited object
  30.  * fields.
  31.  */
  32. #define EWL_OBJECT(object) ((Ewl_Object *) object)
  33.  
  34. /**
  35.  * @class Ewl_Object
  36.  * @brief Provides facilities for sizing, position, alignment and fill policy.
  37.  *
  38.  * The fields of the object, while their explanations are fairly clear, can be
  39.  * visualized with the following diagram:
  40.  *
  41.  * @image html object_fields.png
  42.  *
  43.  * The CURRENT_W(w) and CURRENT_H(w) are macros that provide easy access to the
  44.  * data fields describing the internal area of the Ewl_Object. While the
  45.  * functions ewl_object_get_current_w(w) and ewl_object_get_current_h(w) are
  46.  * to access the overall size of the area this Ewl_Object resides in. There
  47.  * are corresponding macros and functions for preferred, minimum and maximum
  48.  * sizes as well. There are also functions for setting each of these values.
  49.  *
  50.  * The affect of the fields when performing layout is as follows:
  51.  *
  52.  * @image html object_sizing.png
  53.  *
  54.  * As illustrated, the fill policy determines how much space an object will
  55.  * use when the request for a specific size is made. When the fill policy
  56.  * contains EWL_FLAG_FILL_HSHRINK, EWL_FLAG_FILL_VSHRINK or both, the
  57.  * Ewl_Object can be resized down to it's minimum size in width, height or both
  58.  * respectively.
  59.  *
  60.  * The opposite is true for a fill policy containing EWL_FLAG_FILL_HFILL,
  61.  * EWL_FLAG_FILL_VFILL or both, The Ewl_Object will now expand to fill the
  62.  * space up to it's maximum size in the respective direction.
  63.  */
  64. struct Ewl_Object
  65. {
  66.     struct
  67.     {
  68.         int             x, /**< Horizontal position */
  69.                 y; /**< Vertical position */
  70.         int             w, /**< Width */
  71.                 h; /**< Height */
  72.     } current; /**< The current size and position of an object. */
  73.  
  74.     struct
  75.     {
  76.         int             w, /**< Width */
  77.                 h; /**< Height */
  78.     }
  79.     preferred, /**< The optimal size of the object in ideal circumstances */
  80.     maximum, /**< The guaranteed maximum size this object will receive. */
  81.     minimum; /**< The guaranteed minimum size this object will receive. */
  82.  
  83.     struct
  84.     {
  85.         int             l, /**< Left value */
  86.                 r, /**< Right value */
  87.                 t, /**< Top value */
  88.                 b; /**< Bottom value */
  89.     } pad, /**< The space padded around the outside of the object. */
  90.     insets; /**< The space inside where children should not be laid out. */
  91.  
  92.     unsigned int flags; /**< Bitmask indicating fill policy and alignment */
  93. };
  94.  
  95. int             ewl_object_init(Ewl_Object *o);
  96. void            ewl_object_current_geometry_get(Ewl_Object *o, int *x, int *y,
  97.                         int *w, int *h);
  98.  
  99. void            ewl_object_current_size_get(Ewl_Object *o, int *w, int *h);
  100. int             ewl_object_current_x_get(Ewl_Object *o);
  101. int             ewl_object_current_y_get(Ewl_Object *o);
  102. int             ewl_object_current_w_get(Ewl_Object *o);
  103. int             ewl_object_current_h_get(Ewl_Object *o);
  104.  
  105. void            ewl_object_preferred_inner_size_set(Ewl_Object *o, int w, int h);
  106. void            ewl_object_preferred_inner_size_get(Ewl_Object *o, int *w, int *h);
  107. void            ewl_object_preferred_size_get(Ewl_Object *o, int *w, int *h);
  108.  
  109. void            ewl_object_preferred_inner_w_set(Ewl_Object *o, int w);
  110. int             ewl_object_preferred_w_get(Ewl_Object *o);
  111. int             ewl_object_preferred_inner_w_get(Ewl_Object *o);
  112.  
  113. void            ewl_object_preferred_inner_h_set(Ewl_Object *o, int h);
  114. int             ewl_object_preferred_inner_h_get(Ewl_Object *o);
  115. int             ewl_object_preferred_h_get(Ewl_Object *o);
  116.  
  117. void            ewl_object_geometry_request(Ewl_Object *o, int x, int y,
  118.                         int w, int h);
  119. void            ewl_object_size_request(Ewl_Object *o, int w, int h);
  120. void            ewl_object_position_request(Ewl_Object *o, int x, int y);
  121. inline void     ewl_object_x_request(Ewl_Object *o, int x);
  122. inline void     ewl_object_y_request(Ewl_Object *o, int y);
  123. void            ewl_object_w_request(Ewl_Object *o, int w);
  124. void            ewl_object_h_request(Ewl_Object *o, int h);
  125.  
  126. void            ewl_object_minimum_size_set(Ewl_Object *o, int w, int h);
  127. inline void     ewl_object_minimum_w_set(Ewl_Object *o, int w);
  128. inline void     ewl_object_minimum_h_set(Ewl_Object *o, int h);
  129.  
  130. void            ewl_object_minimum_size_get(Ewl_Object *o, int *w, int *h);
  131. inline int      ewl_object_minimum_w_get(Ewl_Object *o);
  132. inline int      ewl_object_minimum_h_get(Ewl_Object *o);
  133.  
  134. void            ewl_object_maximum_size_set(Ewl_Object *o, int w, int h);
  135. inline void     ewl_object_maximum_w_set(Ewl_Object *o, int w);
  136. inline void     ewl_object_maximum_h_set(Ewl_Object *o, int h);
  137.  
  138. void            ewl_object_maximum_size_get(Ewl_Object *o, int *w, int *h);
  139. inline int    ewl_object_maximum_w_get(Ewl_Object *o);
  140. inline int    ewl_object_maximum_h_get(Ewl_Object *o);
  141.  
  142. unsigned int    ewl_object_alignment_get(Ewl_Object *o);
  143. inline void     ewl_object_alignment_set(Ewl_Object *o, unsigned int align);
  144. void            ewl_object_place(Ewl_Object *o, int x, int y, int w, int h);
  145.  
  146. unsigned int    ewl_object_fill_policy_get(Ewl_Object *o);
  147. inline void     ewl_object_fill_policy_set(Ewl_Object *o, unsigned int fill);
  148.  
  149. /*
  150.  * Padding setting and retrieval functions.
  151.  */
  152. void            ewl_object_padding_set(Ewl_Object *o, int l, int r, int t,
  153.                        int b);
  154. void            ewl_object_padding_get(Ewl_Object *o, int *l, int *r, int *t,
  155.                        int *b);
  156. int             ewl_object_padding_top_get(Ewl_Object *o);
  157. int             ewl_object_padding_bottom_get(Ewl_Object *o);
  158. int             ewl_object_padding_left_get(Ewl_Object *o);
  159. int             ewl_object_padding_right_get(Ewl_Object *o);
  160.  
  161. /*
  162.  * Inset setting and retrieval functions.
  163.  */
  164. void            ewl_object_insets_set(Ewl_Object *o, int l, int r, int t,
  165.                       int b);
  166. void            ewl_object_insets_get(Ewl_Object *o, int *l, int *r, int *t,
  167.                       int *b);
  168. int             ewl_object_insets_top_get(Ewl_Object *o);
  169. int             ewl_object_insets_bottom_get(Ewl_Object *o);
  170. int             ewl_object_insets_left_get(Ewl_Object *o);
  171. int             ewl_object_insets_right_get(Ewl_Object *o);
  172.  
  173. void            ewl_object_flags_add(Ewl_Object *o, unsigned int flags,
  174.                      unsigned int mask);
  175. void            ewl_object_flags_remove(Ewl_Object *o, unsigned int flags,
  176.                     unsigned int mask);
  177. unsigned int    ewl_object_flags_has(Ewl_Object *o, unsigned int flags,
  178.                      unsigned int mask);
  179. unsigned int    ewl_object_flags_get(Ewl_Object *o, unsigned int mask);
  180.  
  181. /**
  182.  * @def ewl_object_recursive_set(o)
  183.  * @param o: the object to change the recursive flag
  184.  * @param val: a boolean indicating the value of the recursive flag
  185.  * @return Returns no value.
  186.  * @brief Changes the recursive flag value to match @a val.
  187.  */
  188. #define ewl_object_recursive_set(o, val) \
  189.     (val ? ewl_object_flags_add(o, EWL_FLAG_PROPERTY_RECURSIVE, \
  190.                     EWL_FLAGS_PROPERTY_MASK) : \
  191.      ewl_object_flags_remove(o, EWL_FLAG_PROPERTY_RECURSIVE, \
  192.                     EWL_FLAGS_PROPERTY_MASK));
  193.  
  194. /**
  195.  * @def ewl_object_recursive_get(o)
  196.  * @param o: the parameter to retrieve the current value of recursive flag
  197.  * @return Returns the current setting of the recursive flag for @a o.
  198.  * @brief Retrieves the current setting of the recursive flag for @a o.
  199.  */
  200. #define ewl_object_recursive_get(o) \
  201.     (ewl_object_flags_get(o, EWL_FLAGS_PROPERTY_MASK) & \
  202.      EWL_FLAG_PROPERTY_RECURSIVE)
  203.  
  204. /**
  205.  * @def ewl_object_toplevel_set(o, val)
  206.  * @param o: the object to change the top level flag
  207.  * @param val: a boolean indicating the value of the top level flag
  208.  * @return Returns no value.
  209.  * @brief Changes the top level flag value to match @a val.
  210.  */
  211. #define ewl_object_toplevel_set(o, val) \
  212.     (val ? ewl_object_flags_add(o, EWL_FLAG_PROPERTY_TOPLEVEL, \
  213.                     EWL_FLAGS_PROPERTY_MASK) : \
  214.      ewl_object_flags_remove(o, EWL_FLAG_PROPERTY_RECURSIVE, \
  215.                     EWL_FLAGS_PROPERTY_MASK));
  216.  
  217. /**
  218.  * @def ewl_object_toplevel_get(o)
  219.  * @param o: the parameter to retrieve the current value of top level flag
  220.  * @return Returns the current setting of the top level flag for @a o.
  221.  * @brief Retrieves the current setting of the top level flag for @a o.
  222.  */
  223. #define ewl_object_toplevel_get(o) \
  224.     (ewl_object_flags_get(o, EWL_FLAGS_PROPERTY_MASK) & \
  225.      EWL_FLAG_PROPERTY_TOPLEVEL)
  226.  
  227. #define ewl_object_state_add(o, state) \
  228.     ewl_object_flags_add(o, state, EWL_FLAGS_STATE_MASK)
  229. #define ewl_object_state_remove(o, state) \
  230.     ewl_object_flags_remove(o, state, EWL_FLAGS_STATE_MASK)
  231. #define ewl_object_state_has(o, state) \
  232.     ewl_object_flags_has(o, state, EWL_FLAGS_STATE_MASK)
  233. #define ewl_object_state_get(o, state) \
  234.     ewl_object_flags_get(o, state, EWL_FLAGS_STATE_MASK)
  235.  
  236. #define ewl_object_queued_add(o, queued) \
  237.     ewl_object_flags_add(o, queued, EWL_FLAGS_QUEUED_MASK)
  238. #define ewl_object_queued_remove(o, queued) \
  239.     ewl_object_flags_remove(o, queued, EWL_FLAGS_QUEUED_MASK)
  240. #define ewl_object_queued_has(o, queued) \
  241.     ewl_object_flags_has(o, queued, EWL_FLAGS_QUEUED_MASK)
  242. #define ewl_object_queued_get(o, queued) \
  243.     ewl_object_flags_get(o, queued, EWL_FLAGS_QUEUED_MASK)
  244.  
  245. #define ewl_object_visible_add(o, visible) \
  246.     ewl_object_flags_add(o, visible, EWL_FLAGS_VISIBLE_MASK)
  247. #define ewl_object_visible_remove(o, visible) \
  248.     ewl_object_flags_remove(o, visible, EWL_FLAGS_VISIBLE_MASK)
  249. #define ewl_object_visible_has(o, visible) \
  250.     ewl_object_flags_has(o, visible, EWL_FLAGS_VISIBLE_MASK)
  251. #define ewl_object_visible_get(o, visible) \
  252.     ewl_object_flags_get(o, visible, EWL_FLAGS_VISIBLE_MASK)
  253.  
  254. #define PADDING_TOP(o) EWL_OBJECT(o)->pad.t
  255. #define PADDING_BOTTOM(o) EWL_OBJECT(o)->pad.b
  256. #define PADDING_LEFT(o) EWL_OBJECT(o)->pad.l
  257. #define PADDING_RIGHT(o) EWL_OBJECT(o)->pad.r
  258.  
  259. #define PADDING_HORIZONTAL(o) (EWL_OBJECT(o)->pad.l + EWL_OBJECT(o)->pad.r)
  260. #define PADDING_VERTICAL(o) (EWL_OBJECT(o)->pad.t + EWL_OBJECT(o)->pad.b)
  261.  
  262. #define INSET_LEFT(o) EWL_OBJECT(o)->insets.l
  263. #define INSET_RIGHT(o) EWL_OBJECT(o)->insets.r
  264. #define INSET_TOP(o) EWL_OBJECT(o)->insets.t
  265. #define INSET_BOTTOM(o) EWL_OBJECT(o)->insets.b
  266.  
  267. #define INSET_HORIZONTAL(o) (EWL_OBJECT(o)->insets.l + EWL_OBJECT(o)->insets.r)
  268. #define INSET_VERTICAL(o) (EWL_OBJECT(o)->insets.t + EWL_OBJECT(o)->insets.b)
  269.  
  270. #define CURRENT_X(o) EWL_OBJECT(o)->current.x
  271. #define CURRENT_Y(o) EWL_OBJECT(o)->current.y
  272. #define CURRENT_W(o) EWL_OBJECT(o)->current.w
  273. #define CURRENT_H(o) EWL_OBJECT(o)->current.h
  274.  
  275. #define PREFERRED_W(o) EWL_OBJECT(o)->preferred.w
  276. #define PREFERRED_H(o) EWL_OBJECT(o)->preferred.h
  277.  
  278. #define MAXIMUM_W(o) EWL_OBJECT(o)->maximum.w
  279. #define MAXIMUM_H(o) EWL_OBJECT(o)->maximum.h
  280.  
  281. #define MINIMUM_W(o) EWL_OBJECT(o)->minimum.w
  282. #define MINIMUM_H(o) EWL_OBJECT(o)->minimum.h
  283.  
  284. #define ewl_object_custom_size_set(o, w, h) \
  285.     { \
  286.         ewl_object_minimum_size_set(o, w, h); \
  287.         ewl_object_maximum_size_set(o, w, h); \
  288.          ewl_object_fill_policy_set(o, EWL_FLAG_FILL_NONE); \
  289.     }
  290.  
  291. #define ewl_object_custom_w_set(o, w) \
  292.     { \
  293.         ewl_object_maximum_w_set(o, w); \
  294.         ewl_object_minimum_w_set(o, w); \
  295.         ewl_object_fill_policy_set(o, ewl_object_fill_policy_get(o) & \
  296.                 ~(EWL_FLAG_FILL_HFILL | EWL_FLAG_FILL_HSHRINK)); \
  297.     }
  298.  
  299. #define ewl_object_custom_h_set(o, h) \
  300.     { \
  301.         ewl_object_maximum_h_set(o, h); \
  302.         ewl_object_minimum_h_set(o, h); \
  303.         ewl_object_fill_policy_set(o, ewl_object_fill_policy_get(o) & \
  304.                 ~(EWL_FLAG_FILL_VFILL | EWL_FLAG_FILL_VSHRINK)); \
  305.     }
  306.  
  307. /**
  308.  * @def RECURSIVE(o)
  309.  * Used to test if a widget is recursive, aka. an Ewl_Container
  310.  */
  311. #define RECURSIVE(o) (EWL_OBJECT(o)->flags & EWL_FLAG_PROPERTY_RECURSIVE)
  312.  
  313. /**
  314.  * @def REALIZED(o)
  315.  * Used to test if a widget has been realized.
  316.  */
  317. #define REALIZED(o) (EWL_OBJECT(o)->flags & EWL_FLAG_VISIBLE_REALIZED)
  318.  
  319. /**
  320.  * @def VISIBLE(o)
  321.  * Used to test if a widget is visible.
  322.  */
  323. #define VISIBLE(o) (EWL_OBJECT(o)->flags & EWL_FLAG_VISIBLE_SHOWN)
  324.  
  325. /**
  326.  * @def OBSCURED(o)
  327.  * Used to determine if a widget is marked as obscured.
  328.  */
  329. #define OBSCURED(o) (EWL_OBJECT(o)->flags & EWL_FLAG_VISIBLE_OBSCURED)
  330.  
  331. /**
  332.  * @def HIDDEN(o)
  333.  * Used to determine if a widget is hidden.
  334.  */
  335. #define HIDDEN(o) (!(EWL_OBJECT(o)->flags & EWL_FLAG_VISIBLE_SHOWN))
  336.  
  337. /**
  338.  * @}
  339.  */
  340.  
  341. #endif                /* __EWL_OBJECT_H__ */
  342.